package com.aisile.admin.service.impl;

import cn.hutool.core.util.DesensitizedUtil;
import cn.hutool.crypto.digest.BCrypt;
import com.aisile.admin.mapper.AdUserMapper;
import com.aisile.admin.service.AdLoginService;
import com.aisile.common.exception.CustomExceptionThrows;
import com.aisile.model.admin.dtos.AdUserDto;
import com.aisile.model.admin.pojos.AdUser;
import com.aisile.model.common.dtos.ResponseResult;
import com.aisile.model.common.enums.AdminHttpCodeEnum;
import com.aisile.utils.common.AppJwtUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @Auther:yry
 * @Date:2024/7/12 0012
 * @VERSON:1.0
 */
@Service
@SuppressWarnings("ALL")
public class AdLoginServiceImpl implements AdLoginService {

    @Autowired
    private AdUserMapper adUserMapper;

    @Override
    public ResponseResult login(AdUserDto dto) {
        if(dto == null){
            CustomExceptionThrows.catchAdmin(AdminHttpCodeEnum.PARAM_INVALID);
        }
        if(StringUtils.isEmpty(dto.getName()) || StringUtils.isEmpty(dto.getPassword())){
            // 提示不能为空
            CustomExceptionThrows.catchAdmin(AdminHttpCodeEnum.PARAM_INVALID);
        }
        // 实现思路
        // 1. 根据用户名 查询用户对象
        /*
         判断用户账号状态  只有9放行
         根据用户信息中的密码  和用户填写的密码进行比较
         成功  签发token 令牌 以及 封装用户信息（数据脱敏）
         反向维护登录时间
         */
        AdUser adUser =  adUserMapper.selectOne(
                Wrappers.<AdUser>lambdaQuery().eq(
                        AdUser::getName,dto.getName()
                )
        );
        if(adUser == null){
            // 用户名有误
            CustomExceptionThrows.catchAdmin(AdminHttpCodeEnum.LOGIN_USERNAME_ERROR);
        }
        // 状态
        if(!adUser.getStatus().equals(9)){
            CustomExceptionThrows.catchAdmin(AdminHttpCodeEnum.NO_OPERATOR_AUTH);
        }
        // 证明 用户名没问题、状态也没问题  接下来看密码有没有问题
        if(!BCrypt.checkpw(dto.getPassword(),adUser.getPassword())){
            CustomExceptionThrows.catchAdmin(AdminHttpCodeEnum.LOGIN_PASSWORD_ERROR);
        }
        // 证明登录成功了
        // 方向维护登录信息
        adUser.setLoginTime(new Date());
        adUserMapper.updateById(adUser);

        //签发token
        String token =  AppJwtUtil.getToken(adUser.getId().longValue());
        // 数据脱敏
        adUser.setPhone(DesensitizedUtil.mobilePhone(adUser.getPhone()));
        adUser.setEmail(DesensitizedUtil.email(adUser.getEmail()));
        adUser.setPassword("******");

        // 封装信息
        Map<String,Object> resultMap = new HashMap<>();
        resultMap.put("token",token);
        resultMap.put("user",adUser);

        return ResponseResult.okResult(resultMap);
    }
}
